package com.hxh.generater.common;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.hxh.entity.po.ExplainByResultSet;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Objects;


/**
 * 菜单管理
 * 由本工具搭建的系统,菜单都应该由下列字段构成
 * 后续再考虑开发自定义菜单字段
 * <p>
 * 原因: 工具前端可以修改菜单,如果菜单字段不固定,前端工具无法编辑菜单了
 **/
@Data
public class GenSysMenu implements ExplainByResultSet<GenSysMenu> {

    /**
     * ID
     * 索引:PRI
     **/
    private Long id;

    /**
     * 父菜单ID
     **/
    private Long parentId;

    /**
     * 父节点ID路径
     **/
    private String treePath;

    /**
     * 菜单名称
     **/
    private String name;

    /**
     * 菜单类型（1：菜单，2：目录，3：外链，4：按钮）
     **/
    private String type;

    /**
     * 路由路径（页面对应的浏览器 URL 路径）
     **/
    private String path;

    /**
     * 组件路径（组件页面完整路径，相对于 src/views/，缺省后缀 .vue）
     **/
    private String component;

    /**
     * 【按钮】权限标识
     **/
    private String perm;

    /**
     * 【目录】只有一个子路由是否始终显示（1：是，0：否）
     **/
    private String alwaysShow;

    /**
     * 【菜单】是否开启页面缓存（1：是，0：否）
     **/
    private String keepAlive;

    /**
     * 显示状态（1：显示，0：隐藏）
     **/
    private String visible;

    /**
     * 排序
     **/
    private Integer sort;

    /**
     * 菜单图标
     **/
    private String icon;

    /**
     * 跳转路径
     **/
    private String redirect;

    /**
     * 创建时间
     **/
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private java.util.Date createTime;

    /**
     * 更新时间
     **/
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private java.util.Date updateTime;

    /**
     * 路由参数
     **/
    private String params;

    private List<GenSysMenu> children;


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        GenSysMenu sysMenu = (GenSysMenu) o;
        return Objects.equals(id, sysMenu.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public GenSysMenu getOneByRs(ResultSet resultSet) throws SQLException {
        GenSysMenu sysMenu = this;
        sysMenu.setId(resultSet.getLong("id"));
        sysMenu.setParentId(resultSet.getLong("parent_id"));
        sysMenu.setTreePath(resultSet.getString("tree_path"));
        sysMenu.setName(resultSet.getString("name"));
        sysMenu.setType(resultSet.getString("type"));
        sysMenu.setPath(resultSet.getString("path"));
        sysMenu.setComponent(resultSet.getString("component"));
        sysMenu.setPerm(resultSet.getString("perm"));
        sysMenu.setAlwaysShow(resultSet.getString("always_show"));
        sysMenu.setKeepAlive(resultSet.getString("keep_alive"));
        sysMenu.setVisible(resultSet.getString("visible"));
        sysMenu.setSort(resultSet.getInt("sort"));
        sysMenu.setIcon(resultSet.getString("icon"));
        sysMenu.setRedirect(resultSet.getString("redirect"));
        sysMenu.setParams(resultSet.getString("params"));
        return sysMenu;
    }
}
